package com.ys.homework;

import java.util.Scanner;

/**
 * @author CodeYang
 * @Description 双色球练习
 * @Date 2020/12/10 15:26
 */
public class 双色球练习5 {
    /**
     * 购买彩票
     *
     * @return 返回双色球号码--6个红色球+1个蓝色球
     */
    static int[] buyTicket(Scanner input) {
        // 创建双色球 数组
        int[] tickets = new int[7];

        for (int i = 0; i < tickets.length; i++) {
            System.out.println("请输入6个红色球号(数字为1-33),第[" + (i + 1) + "]个红色球号为:");
            int red = input.nextInt();
            // 规则: 红色球号码不能重复 输入范围必须合法
            if (isRepeat(tickets, i, red) || red < 1 || red > 33) {
                System.out.println("您输入的第[" + (i + 1) + "]红色球错误,请重新输入");
                // 本次循环错误,重新执行第i次 循环
                i--;
                //跳出当前循环,进入下一次
                continue;
            }
            tickets[i] = red;
        }
        while (true) {
            System.out.print("请输入一个蓝色球号（数字为1-16）：");
            int blue = input.nextInt();
            if (blue >= 1 && blue <= 16) {
                // 把红色球保存进入数组
                tickets[tickets.length - 1] = blue;
                // 跳出循环
                break;
            }
            // 3.3提示红色球输入错误信息
            System.out.println("您输入的蓝色球不在[1, 16]之间，请重新输入！");
        }
        return tickets;
    }

    /**
     * 判断数组 中是否包含指定元素
     *
     * @param arr           int[] 需要查询的数组
     * @param size          int 数组实际存放元素的个数
     * @param targetElement int 需要查询的目标元素
     * @return (先假设目标值不存在)目标值不存在返回false, 目标值存在返回true
     */
    private static boolean isRepeat(int[] arr, int size, int targetElement) {
        //1 遍历数组元素
        for (int i = 0; i < size; i++) {
            //2把数组中的元素一次和目标元素做对比
            if (arr[i] == targetElement) {
                //3 如果,再数组中存在目标元素,则返回true
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        // 下注总费用
        int totalMoney = 0;
        // 双色球单价,每注2元
        int price = 2;
        // 购买彩票注数
        int count = 0;
        // 标志是否购买
        boolean isBuy = false;
        // 存储双色球号 彩票号
        int[] tickets = null;

        Scanner input = new Scanner(System.in);
        do {
            System.out.println("********欢迎进入双色球彩票系统********");
            System.out.println("\t1.购买彩票");
            System.out.println("\t2.查看开奖");
            System.out.println("\t3.退出");
            System.out.println("**********************************");
            System.out.println("请选择菜单");
            int choose = input.nextInt();
            switch (choose) {
                case 1:
                    System.out.println("[双色球彩票系统>购买彩票]");
                    System.out.println("您需要下多少注?:");
                    count = input.nextInt();
                    // 总下注金额: = 下注数量 * 单价
                    totalMoney = count * price;

                    //开始选号:(6个红色球号和1个蓝色球号) 供选择
                    tickets = buyTicket(input);

                    // 输出已经买好的彩票星星:
                    System.out.println("您一共买了[" + count + "]注,共需支付[" + totalMoney + "]元,所选号为:");
                    for (int i1 : tickets) {
                        System.out.print(i1 + "\t");
                    }
                    //标志已经购买了 双色球
                    isBuy = true;
                    System.out.println();
                    break;
                case 2:
                    System.out.println("[双色球彩票系统>查看开奖]");
                    if (isBuy) {
                        //判断是否购买了彩票,开奖之后,又需要重新购买
                        isBuy = false;
                        int[] luckNum = getLuckNum();
                        // 输出 顾客购买的号码
                        System.out.print("已买彩票号为:");
                        for (int i : tickets) {
                            System.out.print(i + "\t");
                        }
                        System.out.println();

                        System.out.print("当期中将号码:");
                        // 输出当前期的中将号码
                        for (int i : luckNum) {
                            System.out.print(i + "\t");
                        }
                        System.out.println();
                        //获取 获奖等级
                        int result = getCompareResult(tickets, luckNum);
                        if (1 == result) {
                            System.out.println("[一等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (500 * count) + "]万元");
                        } else if (2 == result) {
                            System.out.println("[二等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (400 * count) + "]万元");
                        } else if (3 == result) {
                            System.out.println("[三等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (300 * count) + "]万元");
                        } else if (4 == result) {
                            System.out.println("[四等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (200 * count) + "]万元");
                        } else if (5 == result) {
                            System.out.println("[五等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (100 * count) + "]万元");
                        } else if (6 == result) {
                            System.out.println("[六等奖],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (5 * count) + "]元");
                        } else {
                            System.out.println("[望再街再厉],恭喜你!!!,共下了[" + count + "]注,投资[" + totalMoney + "],获奖[" + (0 * count) + "]元");
                        }
                    } else {
                        System.out.println("请先购买彩票!!!");
                    }

                    break;
                case 3:
                    System.out.println("谢谢使用");
                    System.exit(0); // 结束程序
                    break;
                default:
                    break;
            }
        } while (true);
    }

    /**
     * 计算获奖等级
     * 因为:规则变成了,红色双色球不会重复,所以可以直接比对
     * 三元表达式
     * @param tickets     顾客的彩票号
     * @param luckTickets 随机生成的中奖号码
     * @return
     */
    private static int getCompareResult(int[] tickets, int[] luckTickets) {
        //红球想等数量
        int redEqualCount = 0;
        //蓝球想等数量
        int buleEqualCount = 0;
        //将 顾客号码 与 开奖号码做对比
        for (int i = 0; i < tickets.length - 1; i++) {
            for (int j = 0; j < luckTickets.length - 1; j++) {
              redEqualCount +=tickets[i] == luckTickets[j] ? 1 :0;
//                if (tickets[i] == luckTickets[j]) {
//                    redEqualCount++;
//                    break;
//                }
            }
        }
        // 3.将自己的彩票号和开奖号进行比较（此处只比较蓝色球）
        if (tickets[tickets.length - 1] == luckTickets[luckTickets.length - 1]) {
            buleEqualCount++;
        }
        //得出结果
        if (redEqualCount == 6 && buleEqualCount == 1) {
            // 一等奖,红球与蓝球相同
            return 1;
        } else if (redEqualCount == 6) {
            // 二等奖 6 个红色相同
            return 2;
        } else if (redEqualCount == 5 && buleEqualCount == 1) {
            // 三等将  5红相同和1蓝相同
            return 3;
        } else if (redEqualCount == 5 || (redEqualCount == 4 && buleEqualCount == 1)) {
            // 四等奖 5 红同 或 4红同 和 1蓝同
            return 4;
        } else if (redEqualCount == 4 || (redEqualCount == 4 && buleEqualCount == 1)) {
            // 5等奖 4红 同 或者 3红同+1蓝同
            return 5;
        } else if (buleEqualCount == 1) {
            //六等奖
            return 6;
        }
        // 未中将
        return -1;
    }

    /**
     * 获得一个 幸运号码--->生成中将号码
     *
     * @return int[] 中将号码--> 返回随机生成的双色球号码
     */
    private static int[] getLuckNum() {
        int luckNum[] = new int[7];
        for (int i = 0; i < luckNum.length - 1; i++) {
            // 生成 1- 33 之间的随机数
            int red = (int) (Math.random() * 33) + 1;
            if (isRepeat(luckNum, i, red)) {
                // 不合法,本次循环失败
                i--;
                continue;
            }
            luckNum[i] = red;
        }
        // 生成 1-16 的随机数 蓝色球
        luckNum[luckNum.length - 1] = (int) (Math.random() * 16) + 1;
        // 测试数据
        return new int[]{1,2,3,4,5,6,7};
       // return luckNum;
    }

}


